package com.atguigu.func;

import com.alibaba.druid.pool.DruidPooledConnection;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.common.GmallConfig;
import com.atguigu.utils.DruidDSUtil;
import com.atguigu.utils.JdbcUtil;
import com.atguigu.utils.JedisUtil;
import redis.clients.jedis.Jedis;

import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
/*
要查phoenix的维表数据时,先读redis缓存的数据,如果rediskey,也就是 DIM:表名:phoenix里的key 不为null的话,就读取,并且重置过期时间,因为是热点数据,
如果为null的话就从phoenix查询,并且要把查询结果写到redis,并且设置过期时间为1天
 */
public class DimHandler {
    public static JSONObject getDimInfo(Connection connection,String tableName, String key) throws InvocationTargetException, SQLException, InstantiationException, IllegalAccessException {
        //TODO 1.利用jedis从redis读数据
        //todo 获取redis中数据(读数据)
        Jedis jedis = JedisUtil.getJedis();
        String redisKey = "DIM:" + tableName + ":" + key;
        String dimInfoJson = jedis.get(redisKey);

        if(dimInfoJson !=null){//如果redis有该数据，就将数据返回给请求
            //todo 重置过期时间
            jedis.expire(redisKey,24*3600);//读数据也更新一下过期时间为1天,存热点数据,不要光在写的时候再更新过期时间
            jedis.close();//一旦这里return了,后面的代码就不执行了,所以要关闭一下连接
            return JSON.parseObject(dimInfoJson);
        }


        //TODO 2.redis查不到的话，利用jdbc将phoenix查询结果写到到redis作缓存
        //todo 拼接sql语句(dimInfoJson为null的话就从phoenix查询,并且要把查询结果写到redis,并且设置过期时间为24h)
        String querySql = "select * from "+ GmallConfig.PHOENIX_DB+"."+tableName+" where id='"+key+"'";

        //todo 获取数据(where id =xxx -> 集合里只有一条)
        List<JSONObject> queryList = JdbcUtil.queryList(connection, querySql, JSONObject.class, false);//将从phoenix查询的结果转化为了json对象

        //todo dimInfoJson == null,将数据写到redis
        JSONObject dimInfo = queryList.get(0);//因为查询结果只有一条,直接获取即可
        jedis.set(redisKey,dimInfo.toJSONString());//数据写到redis
        jedis.expire(redisKey,24*3600);//设置过期时间
        jedis.close();//记得关闭连接,否则后面会出问题

        //todo 返回结果（因为是where id=xxx，所以只会返回一条结果数据）
//        return queryList.get(0);
        return dimInfo;

    }
    //测试
    public static void main(String[] args) throws SQLException, InstantiationException, IllegalAccessException, InvocationTargetException {
        //获取连接池
        DruidPooledConnection phoenixConn = DruidDSUtil.getPhoenixConn();
        //从池里获取一个连接
        Connection connection = phoenixConn.getConnection();

        long start = System.currentTimeMillis();
        JSONObject dimInfo = getDimInfo(connection, "DIM_BASE_CATEGORY1", "51");//124 120 123
        long end = System.currentTimeMillis();
        JSONObject dimInfo2 = getDimInfo(connection, "DIM_BASE_CATEGORY1", "51");//8 8 9->2 2 2
        //假设一条数据进来要关联6张维表，那么就是50ms，则1s只能处理20条数据，太慢了
        long end2 = System.currentTimeMillis();


        System.out.println(dimInfo);
        System.out.println(dimInfo2);
        System.out.println(end2-end);

        connection.close();
        phoenixConn.close();

    }


}
